Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / scripts / sign-android-apks.sh

Displaying Raw • Download


scripts/sign-android-apks.sh 65ca9ddc823fcc2c8f8653c553b944b85db0875f (65ca9ddc) Text, 4.24 KB

T8b949e#!/usr/bin/env bash
Tffa657set -euo pipefail

usageTff7b72(Tff7b72) Tff7b72{
cat Ta5d6ff<<'EOF'
Sign Android release APKs (and optionally add SourceStamp).

Required env vars:
SIGNING_KEYSTORE_PATH Path to signing keystore (.jks/.keystore)
SIGNING_KEY_ALIAS Alias of signing key
SIGNING_KEYSTORE_PASSWORD Keystore password
SIGNING_KEY_PASSWORD Key password (defaults to SIGNING_KEYSTORE_PASSWORD)

Optional env vars:
ANDROID_HOME Android SDK root (or ANDROID_SDK_ROOT)
APK_GLOB Glob for unsigned APKs
(default: android/app/build/outputs/apk/*/release/*-unsigned.apk)
ENABLE_SOURCESTAMP true/false (default: false)
SOURCESTAMP_KEYSTORE_PATH Path to SourceStamp keystore
SOURCESTAMP_KEY_ALIAS Alias in SourceStamp keystore
SOURCESTAMP_KEYSTORE_PASSWORD SourceStamp keystore password
SOURCESTAMP_KEY_PASSWORD SourceStamp key password

Output:
Creates sibling files for each unsigned APK:
*-aligned.apk
*-signed.apk

Examples:
SIGNING_KEYSTORE_PATH=android/keystore/meshchatx-release.jks \
SIGNING_KEY_ALIAS=meshchatx-release \
SIGNING_KEYSTORE_PASSWORD='...' \
SIGNING_KEY_PASSWORD='...' \
bash scripts/sign-android-apks.sh

SIGNING_KEYSTORE_PATH=android/keystore/meshchatx-release.jks \
SIGNING_KEY_ALIAS=meshchatx-release \
SIGNING_KEYSTORE_PASSWORD='...' \
SIGNING_KEY_PASSWORD='...' \
ENABLE_SOURCESTAMP=true \
SOURCESTAMP_KEYSTORE_PATH=android/keystore/meshchatx-stamp.jks \
SOURCESTAMP_KEY_ALIAS=meshchatx-stamp \
SOURCESTAMP_KEYSTORE_PASSWORD='...' \
SOURCESTAMP_KEY_PASSWORD='...' \
bash scripts/sign-android-apks.sh
EOF
Tff7b72}

Tff7b72if Tff7b72[Tff7b72[ Ta5d6ff"Tffd700${Te6edf31Tff7b72:-Tffd700}Ta5d6ff" Tff7b72=Tff7b72= Ta5d6ff"-h" Tff7b72|| Ta5d6ff"Tffd700${Te6edf31Tff7b72:-Tffd700}Ta5d6ff" Tff7b72=Tff7b72= Ta5d6ff"--help" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
usage
Tffa657exit T79c0ff0
Tff7b72fi

require_envTff7b72(Tff7b72) Tff7b72{
Tffa657local Te6edf3nameTff7b72=Ta5d6ff"Te6edf3$1Ta5d6ff"
Tff7b72if Tff7b72[Tff7b72[ -z Ta5d6ff"Tffd700${Tb4b4b4!nameTff7b72:-Tffd700}Ta5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffMissing required env var: Tffd700${Te6edf3nameTffd700}Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Tff7b72}

require_env SIGNING_KEYSTORE_PATH
require_env SIGNING_KEY_ALIAS
require_env SIGNING_KEYSTORE_PASSWORD
Te6edf3SIGNING_KEY_PASSWORDTff7b72=Ta5d6ff"Tffd700${Te6edf3SIGNING_KEY_PASSWORDTff7b72:-Tffd700${Te6edf3SIGNING_KEYSTORE_PASSWORDTffd700}Tffd700}Ta5d6ff"

Te6edf3ANDROID_HOMETff7b72=Ta5d6ff"Tffd700${Te6edf3ANDROID_HOMETff7b72:-Tffd700${Te6edf3ANDROID_SDK_ROOTTff7b72:-Tffd700}Tffd700}Ta5d6ff"
Tff7b72if Tff7b72[Tff7b72[ -z Ta5d6ff"Tffd700${Te6edf3ANDROID_HOMETffd700}Ta5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Set ANDROID_HOME (or ANDROID_SDK_ROOT) to your Android SDK path." >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi

Te6edf3BT_DIRTff7b72=Ta5d6ff"Tff7b72$(find Ta5d6ff"Tffd700${Te6edf3ANDROID_HOMETffd700}Ta5d6ff/build-toolsTa5d6ff" -mindepth T79c0ff1 -maxdepth T79c0ff1 -type d T79c0ff2>/dev/null Tb4b4b4| sort -V Tb4b4b4| tail -n T79c0ff1Tff7b72)Ta5d6ff"
Tff7b72if Tff7b72[Tff7b72[ -z Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffNo Android build-tools found under Tffd700${Te6edf3ANDROID_HOMETffd700}Ta5d6ff/build-tools.Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Tff7b72if Tff7b72[Tff7b72[ ! -x Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff/zipalignTa5d6ff" Tff7b72|| ! -x Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff/apksignerTa5d6ff" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffMissing zipalign/apksigner in Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff. Install build-tools via sdkmanager.Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi

Te6edf3APK_GLOBTff7b72=Ta5d6ff"Tffd700${Te6edf3APK_GLOBTff7b72:-Te6edf3androidTb4b4b4/app/build/outputs/apk/release/*-unsigned.apkTffd700}Ta5d6ff"
mapfile -t APKS < <Tff7b72(Tffa657compgen -G Ta5d6ff"Tffd700${Te6edf3APK_GLOBTffd700}Ta5d6ff" Tff7b72|| Tffa657trueTff7b72)
Tff7b72if Tff7b72[Tff7b72[ Tffd700${#Te6edf3APKSTb4b4b4[@]Tffd700} -eq T79c0ff0 Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffNo unsigned APKs matched: Tffd700${Te6edf3APK_GLOBTffd700}Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi

Te6edf3ENABLE_SOURCESTAMPTff7b72=Ta5d6ff"Tffd700${Te6edf3ENABLE_SOURCESTAMPTff7b72:-Te6edf3falseTffd700}Ta5d6ff"
Tff7b72if Tff7b72[Tff7b72[ Ta5d6ff"Tffd700${Te6edf3ENABLE_SOURCESTAMPTffd700}Ta5d6ff" Tff7b72=Tff7b72= Ta5d6ff"true" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
require_env SOURCESTAMP_KEYSTORE_PATH
require_env SOURCESTAMP_KEY_ALIAS
require_env SOURCESTAMP_KEYSTORE_PASSWORD
Te6edf3SOURCESTAMP_KEY_PASSWORDTff7b72=Ta5d6ff"Tffd700${Te6edf3SOURCESTAMP_KEY_PASSWORDTff7b72:-Tffd700${Te6edf3SOURCESTAMP_KEYSTORE_PASSWORDTffd700}Tffd700}Ta5d6ff"
Tff7b72fi

Tff7b72for apk Tff7b72in Ta5d6ff"Tffd700${Te6edf3APKSTb4b4b4[@]Tffd700}Ta5d6ff"Tb4b4b4; Tff7b72do
Te6edf3baseTff7b72=Ta5d6ff"Tffd700${Te6edf3apkTb4b4b4%-unsigned.apkTffd700}Ta5d6ff"
Te6edf3alignedTff7b72=Ta5d6ff"Tffd700${Te6edf3baseTffd700}Ta5d6ff-aligned.apkTa5d6ff"
Te6edf3signedTff7b72=Ta5d6ff"Tffd700${Te6edf3baseTffd700}Ta5d6ff-signed.apkTa5d6ff"

Tffa657echo Ta5d6ff"Ta5d6ffAligning Tffd700${Te6edf3apkTffd700}Ta5d6ff"
Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff/zipalignTa5d6ff" -p -f T79c0ff4 Ta5d6ff"Tffd700${Te6edf3apkTffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3alignedTffd700}Ta5d6ff"

Te6edf3sign_argsTff7b72=Tff7b72(
sign
--ks Ta5d6ff"Tffd700${Te6edf3SIGNING_KEYSTORE_PATHTffd700}Ta5d6ff"
--ks-key-alias Ta5d6ff"Tffd700${Te6edf3SIGNING_KEY_ALIASTffd700}Ta5d6ff"
--ks-pass Ta5d6ff"Ta5d6ffpass:Tffd700${Te6edf3SIGNING_KEYSTORE_PASSWORDTffd700}Ta5d6ff"
--key-pass Ta5d6ff"Ta5d6ffpass:Tffd700${Te6edf3SIGNING_KEY_PASSWORDTffd700}Ta5d6ff"
--out Ta5d6ff"Tffd700${Te6edf3signedTffd700}Ta5d6ff"
Tff7b72)

Tff7b72if Tff7b72[Tff7b72[ Ta5d6ff"Tffd700${Te6edf3ENABLE_SOURCESTAMPTffd700}Ta5d6ff" Tff7b72=Tff7b72= Ta5d6ff"true" Tff7b72]Tff7b72]Tb4b4b4; Tff7b72then
Te6edf3sign_argsTff7b72+=Tff7b72(
--stamp-signer
--stamp-ks Ta5d6ff"Tffd700${Te6edf3SOURCESTAMP_KEYSTORE_PATHTffd700}Ta5d6ff"
--stamp-key-alias Ta5d6ff"Tffd700${Te6edf3SOURCESTAMP_KEY_ALIASTffd700}Ta5d6ff"
--stamp-ks-pass Ta5d6ff"Ta5d6ffpass:Tffd700${Te6edf3SOURCESTAMP_KEYSTORE_PASSWORDTffd700}Ta5d6ff"
--stamp-key-pass Ta5d6ff"Ta5d6ffpass:Tffd700${Te6edf3SOURCESTAMP_KEY_PASSWORDTffd700}Ta5d6ff"
Tff7b72)
Tff7b72fi

Tffa657echo Ta5d6ff"Ta5d6ffSigning Tffd700${Te6edf3alignedTffd700}Ta5d6ff"
Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff/apksignerTa5d6ff" Ta5d6ff"Tffd700${Te6edf3sign_argsTb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3alignedTffd700}Ta5d6ff"

Tffa657echo Ta5d6ff"Ta5d6ffVerifying Tffd700${Te6edf3signedTffd700}Ta5d6ff"
Ta5d6ff"Tffd700${Te6edf3BT_DIRTffd700}Ta5d6ff/apksignerTa5d6ff" verify --verbose --print-certs Ta5d6ff"Tffd700${Te6edf3signedTffd700}Ta5d6ff"
Tff7b72done

Tffa657echo Ta5d6ff"Done."


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────